// function addNum(x: number, y: number):number {
//     return x+y
// }

// 在ts 中当函数的形参，确定好之后，是不允许，不传，少传，或者多传的。
// addNum();
// addNum(1);
// addNum(1,2,3);

// 函数的可选参数
// z?:number 就是函数 addNum 可选参数 （在调用该函数的时候，可传可不传）
// 特点：参数名称后面加 ？必须是英文状态下的
// function addNum(x: number, y: number,z?:number):number {
//     return x+y+(z?z:0) // 函数里面也是可以写表达式的
// }
// 特别注意：可选参数，一定要放到最后，也就是说，（可选参数的后面不允许出现必选参数）
// addNum(1,3);
// addNum(1,2,3);

// 默认参数

// function addNum(x?: number, y: number=10):number {
//     return (x?x:0)+y
// }

// // 如果说，函数的形参，有默认值的话，该函数，在调用的时候，该形参，就可传可不传
// console.log(addNum(1)) // 2

// 特别注意：如果说函数的必选参数有默认值的话，前面是允许出现，可选参数的





// 函数的剩余参数

// function addNum(x:number,...args:number[]):number{ // 传入参数求和
//     console.log(args);
//     let sum = x
//     for(let i = 0,item;item=args[i++];){
//         sum = sum + item
//     }
//     return sum
// }

// console.log(addNum(1,2,3,4,5,6));


// function fn (...val:number[]) {
//     console.log(arguments);
// }
// let fn = (...val:number[]) => {
//    console.log(val);
// }
// 普通函数，可以使用 剩余参数，箭头函数 没有 arguments。



// 函数的重载

// 声明一个函数 getUser，返回 string类型
// function getUser(name:string):string;

// // 仍然声明同名函数 getUser，返回数字类型
// function getUser(age:number):number;

// // 函数的重载，也可以这样理解，其实就是 函数的联合类型
// function getUser(str:any):any {
//     if(typeof str==='string'){
//         return '我的名字'+str
//     }else{
//         return str
//     }
// }

// console.log(getUser('小明'));
// console.log(getUser(18));




function getUser(name:string):string;

function getUser(name:string,age:number):number;

function getUser(name:any,age?:number):any {
     if(age){
         return '我的名字'+name+'多大'+ age
     }else{
         return '我的名字'+name+'多大保密'
     }
}
console.log(getUser('小明'));
console.log(getUser('小明',10));